/******************************************************************
 * 文件: custom_main.c
 * 功能: OpenCPU 示例程序
 * 描述:
 *  1. 主入口创建系统初始化任务
 *  2. 系统初始化任务创建两个周期任务（dataReportTask1 / dataReportTask2）
 *  3. 两个数据上报任务使用多任务安全的绝对延时函数保持固定节拍
 ******************************************************************/

#include "custom_main.h" // 自定义主程序头文件

/**************************************************************
 * OpenCPU 主入口
 * 禁止任何阻塞操作
 **************************************************************/
int cm_opencpu_entry(void *arg)
{
    (void)arg;

    cm_log_printf(0, "cm_opencpu_entry is running\n");

    // 系统初始化任务属性
    osThreadAttr_t app_task_attr = {0};
    app_task_attr.name = "main_task";
    app_task_attr.stack_size = 4096 * 2; // 根据任务需求分配堆栈
    app_task_attr.priority = osPriorityNormal;

    // 创建系统初始化任务
    osThreadNew((osThreadFunc_t)sysInitTask, 0, &app_task_attr);

    return 0;
}

/**************************************************************
 * 系统初始化任务
 * 功能:
 * 1. 等待模组 PDP 激活
 * 2. 创建数据上报任务1 和 数据上报任务2
 * 3. 初始化完成后任务退出，不再占用 CPU
 **************************************************************/

void sysInitTask(void)
{

    cm_log_printf(0, "sysInitTask is running\n"); // 系统开始初始化任务------begin

    // 创建核心任务：
    //  MQTT服务线程
#if ENABLE_MQTT_SERVICE
    osThreadAttr_t mqttService_task_attr = {0};
    mqttService_task_attr.name = "mqttServiceTask";
    mqttService_task_attr.stack_size = 1024 * 2;
    mqttService_task_attr.priority = osPriorityNormal;
    osThreadNew((osThreadFunc_t)mqtt_service_task, NULL, &mqttService_task_attr);
#endif // ENABLE_MQTT_SERVICE

    // 创建数据上报任务
#if ENABLE_MQTT_PUBLISH
    osThreadAttr_t mqttPublish_task_attr = {0};
    mqttPublish_task_attr.name = "mqttPublishTask";
    mqttPublish_task_attr.stack_size = 1024 * 2;
    mqttPublish_task_attr.priority = osPriorityNormal;
    osThreadNew((osThreadFunc_t)mqtt_publish_data_task, NULL, &mqttPublish_task_attr);
#endif // ENABLE_MQTT_PUBLISH

    // 开启modbus主机模式组件初始化任务
#if ENABLE_MODBUS_MASTER_INIT
    osThreadAttr_t modbus_master_init_task_attr = {0};
    modbus_master_init_task_attr.name = "modbus_master_init_task";
    modbus_master_init_task_attr.stack_size = 1024 * 4; // 栈大小
    modbus_master_init_task_attr.priority = osPriorityNormal;
    osThreadNew((osThreadFunc_t)modbus_master_init_task, NULL, &modbus_master_init_task_attr);
#endif

// 开启系统运行呼吸任务
#if ENABLE_SYSTEM_BREATH_TASK
    osThreadAttr_t breath_task_attr = {0};
    breath_task_attr.name = "breath_task";
    breath_task_attr.stack_size = 1024 * 2;
    breath_task_attr.priority = osPriorityLow; // 低优先级。适用于对实时性要求不高的后台任务，例如数据日志记录、状态监测等。
    osThreadNew((osThreadFunc_t)sysRunBreathTask, NULL, &breath_task_attr);
#endif // ENABLE_SYSTEM_BREATH_TASK

    cm_log_printf(0, "sysInitTask is exit\n"); // 系统任务初始化完毕----end
}

// 系统运行呼吸任务
void sysRunBreathTask(void)
{
    unsigned long lastWakeTick = 0;

    while (1)
    {

        // 打印当前内存信息
        cm_mem_print_stats();

        // 绝对延时2秒
        osDelay_absolute_safe(&lastWakeTick, 5000);
    }
}